/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Player;

import Biblioteca.Cancion;
import GUI.PlayerWindow;
import java.io.File;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javazoom.jlgui.basicplayer.BasicController;
import javazoom.jlgui.basicplayer.BasicPlayer;
import javazoom.jlgui.basicplayer.BasicPlayerEvent;
import javazoom.jlgui.basicplayer.BasicPlayerException;
import javazoom.jlgui.basicplayer.BasicPlayerListener;

/**
 *
 * @author rantamplan
 */
public class Player implements BasicPlayerListener {

    /**
     * Atributo que enlaza con la libreria del reproductor
     */
    private BasicPlayer player;
    /**
     * Acceso a la interfaz gráfica
     */
    private PlayerWindow playerWindow;
    /**
     * Cancion cargada en el player
     */
    private Cancion cancionPlayer;
    /**
     * Archivo cargado actualmente en el reproductor
     */
    private File archivoActual;
    /**
     * Volumen del reproductor
     */
    private double volumen = 0.0;
    /**
     * Constructora por defecto
     * @param window acceso interfaz gráfica
     */
    public Player(PlayerWindow window) {
        playerWindow = window;
        archivoActual = null;
        player = new BasicPlayer();
        player.addBasicPlayerListener(this);
        volumen = 1.0;
    }

    /**
     * Devuelve la cancion cargada en el reproductor
     * @return
     */
    public Cancion getCancionPlayer() {
        return cancionPlayer;
    }

    /**
     * Devuelve el estado del reproductor
     * @return
     * Posibles estados:
     * UNKNOWN = -1;
     * PLAYING = 0;
     * PAUSED = 1;
     * STOPPED = 2;
     * OPENED = 3;
     * SEEKING = 4;
     */
    public int getEstado() {
        return player.getStatus();
    }

    /**
     * Reproduce el archivo introducido en cancion
     * @param cancion
     */
    public void play(Cancion cancion) {
        try {
            cancionPlayer = cancion;
            archivoActual = new File(cancionPlayer.getRuta());
            player.open(archivoActual);
            player.play();
            player.setGain(volumen);
        } catch (BasicPlayerException ex) {
            Logger.getLogger(Player.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Pausa la reproduccion del archivo actual
     */
    public void pause() {
        try {
            player.pause();
        } catch (BasicPlayerException ex) {
            Logger.getLogger(Player.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Reanuda la reproduccion del archivo actual
     */
    public void resume() {
        try {
            player.resume();
        } catch (BasicPlayerException ex) {
            Logger.getLogger(Player.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Para la reproduccion del archivo actual
     */
    public void stop() {
        try {
            player.stop();
        } catch (BasicPlayerException ex) {
            Logger.getLogger(Player.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Salta al byte indicado por parámetro
     * @param byteASaltar
     */
    public void seekByte(long byteASaltar) {
        try {
            player.seek(byteASaltar);
        } catch (BasicPlayerException ex) {
            Logger.getLogger(Player.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Cambia el volumen del player
     * @param vol
     */
    public void changeVolume(double vol) {
        try {
            volumen = vol;
            player.setGain(vol);
        } catch (BasicPlayerException ex) {
            Logger.getLogger(Player.class.getName()).log(Level.SEVERE, null, ex);
        }
    }    


    /**
     * Cambia el valor de la variable volumen del player
     * @param vol
     */
    public void setVolume(double vol){
       volumen = vol;
   }

    /**
     * Se ejecuta cada vez que el reproductor abre un archivo
     * @param o
     * @param map
     */
    public void opened(Object o, Map map) {
    }

    /**
     * Se ejecuta varias veces por segundo informando de la situación actual del player y del archivo en reproducción
     * @param bytesread bytes leidos en el momento de ejecucion del método
     * @param microseconds microsegundos leidos en el momento de ejecucion del método
     * @param bytes
     * @param map
     */
    public void progress(int bytesread, long microseconds, byte[] bytes, Map map) {
        playerWindow.actualizaBarraProgreso(bytesread);
    }

    /**
     * Se ejecuta cada vez que el player cambia de estatus
     * @param bpe
     */
    public void stateUpdated(BasicPlayerEvent bpe) {
        if (bpe.getCode() == BasicPlayerEvent.EOM) {
            playerWindow.siguienteCancion();
        }
    }

    /**
     * Se ejecuta cuando se cambia el valor del controller
     * @param bc
     */
    public void setController(BasicController bc) {        
    }
}
